package com.controller;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.annotation.IgnoreAuth;
import com.service.CommonService;
import com.utils.R;

/**
 * 通用接口
 * 作者 team10
 */
@RestController
public class CommonController{
	@Autowired
	private CommonService commonService;

	/**
	 * 获取table表中的column列表(联动接口)
	 * @param tableName
	 * @param columnName
	 * @param level
	 * @param parent
	 * @return
	 */
	@IgnoreAuth
	@RequestMapping("/option/{tableName}/{columnName}")
	public R getOption(@PathVariable("tableName") String tableName, @PathVariable("columnName") String columnName,
					   @RequestParam(required = false) String level, @RequestParam(required = false) String parent) {
		Map<String, Object> params = new HashMap<>();
		params.put("table", tableName);  // 确保传递了正确的表名
		params.put("column", columnName); // 确保传递了正确的列名
		if (StringUtils.isNotBlank(level)) {
			params.put("level", level);
		}
		if (StringUtils.isNotBlank(parent)) {
			params.put("parent", parent);
		}
		List<String> data = commonService.getOption(params);
		return R.ok().put("data", data);
	}

	/**
	 * 根据table中的column获取单条记录
	 * @param tableName
	 * @param columnName
	 * @param columnValue
	 * @return
	 */
	@IgnoreAuth
	@RequestMapping("/follow/{tableName}/{columnName}")
	public R getFollowByOption(@PathVariable("tableName") String tableName, @PathVariable("columnName") String columnName,
							   @RequestParam String columnValue) {
		Map<String, Object> params = new HashMap<>();
		params.put("table", tableName);  // 确保传递了正确的表名
		params.put("column", columnName); // 确保传递了正确的列名
		params.put("columnValue", columnValue);
		Map<String, Object> result = commonService.getFollowByOption(params);
		return R.ok().put("data", result);
	}

	/**
	 * 修改table表的sfsh状态
	 * @param tableName
	 * @param map
	 * @return
	 */
	@RequestMapping("/sh/{tableName}")
	public R sh(@PathVariable("tableName") String tableName, @RequestBody Map<String, Object> map) {
		map.put("table", tableName); // 确保传递了表名
		commonService.sh(map);
		return R.ok();
	}

	/**
	 * 获取需要提醒的记录数
	 * @param tableName
	 * @param columnName
	 * @param type 1:数字 2:日期
	 * @param map
	 * @return
	 */
	@IgnoreAuth
	@RequestMapping("/remind/{tableName}/{columnName}/{type}")
	public R remindCount(@PathVariable("tableName") String tableName, @PathVariable("columnName") String columnName,
						 @PathVariable("type") String type, @RequestParam Map<String, Object> map) {
		map.put("table", tableName); // 确保传递了表名
		map.put("column", columnName); // 确保传递了列名
		map.put("type", type);

		if (type.equals("2")) { // 处理日期类型的提醒
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
			Calendar c = Calendar.getInstance();
			Date remindStartDate = null;
			Date remindEndDate = null;
			if (map.get("remindstart") != null) {
				Integer remindStart = Integer.parseInt(map.get("remindstart").toString());
				c.setTime(new Date());
				c.add(Calendar.DAY_OF_MONTH, remindStart);
				remindStartDate = c.getTime();
				map.put("remindstart", sdf.format(remindStartDate));
			}
			if (map.get("remindend") != null) {
				Integer remindEnd = Integer.parseInt(map.get("remindend").toString());
				c.setTime(new Date());
				c.add(Calendar.DAY_OF_MONTH, remindEnd);
				remindEndDate = c.getTime();
				map.put("remindend", sdf.format(remindEndDate));
			}
		}

		int count = commonService.remindCount(map);
		return R.ok().put("count", count);
	}

	/**
	 * 单列求和
	 */
	@IgnoreAuth
	@RequestMapping("/cal/{tableName}/{columnName}")
	public R cal(@PathVariable("tableName") String tableName, @PathVariable("columnName") String columnName) {
		Map<String, Object> params = new HashMap<>();
		params.put("table", tableName); // 确保传递了表名
		params.put("column", columnName); // 确保传递了列名
		Map<String, Object> result = commonService.selectCal(params);
		return R.ok().put("data", result);
	}

	/**
	 * 分组统计
	 */
	@IgnoreAuth
	@RequestMapping("/group/{tableName}/{columnName}")
	public R group(@PathVariable("tableName") String tableName, @PathVariable("columnName") String columnName) {
		Map<String, Object> params = new HashMap<>();
		params.put("table", tableName); // 确保传递了表名
		params.put("column", columnName); // 确保传递了列名
		List<Map<String, Object>> result = commonService.selectGroup(params);
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		for (Map<String, Object> m : result) {
			for (String k : m.keySet()) {
				if (m.get(k) instanceof Date) {
					m.put(k, sdf.format((Date) m.get(k)));
				}
			}
		}
		return R.ok().put("data", result);
	}

	/**
	 * （按值统计）
	 */
	@IgnoreAuth
	@RequestMapping("/value/{tableName}/{xColumnName}/{yColumnName}")
	public R value(@PathVariable("tableName") String tableName, @PathVariable("yColumnName") String yColumnName,
				   @PathVariable("xColumnName") String xColumnName) {
		Map<String, Object> params = new HashMap<>();
		params.put("table", tableName); // 确保传递了表名
		params.put("xColumn", xColumnName); // 确保传递了x列名
		params.put("yColumn", yColumnName); // 确保传递了y列名
		List<Map<String, Object>> result = commonService.selectValue(params);
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		for (Map<String, Object> m : result) {
			for (String k : m.keySet()) {
				if (m.get(k) instanceof Date) {
					m.put(k, sdf.format((Date) m.get(k)));
				}
			}
		}
		return R.ok().put("data", result);
	}

	/**
	 * （按值统计）时间统计类型
	 */
	@IgnoreAuth
	@RequestMapping("/value/{tableName}/{xColumnName}/{yColumnName}/{timeStatType}")
	public R valueDay(@PathVariable("tableName") String tableName, @PathVariable("yColumnName") String yColumnName,
					  @PathVariable("xColumnName") String xColumnName, @PathVariable("timeStatType") String timeStatType) {
		Map<String, Object> params = new HashMap<>();
		params.put("table", tableName); // 确保传递了表名
		params.put("xColumn", xColumnName); // 确保传递了x列名
		params.put("yColumn", yColumnName); // 确保传递了y列名
		params.put("timeStatType", timeStatType); // 确保传递了时间统计类型
		List<Map<String, Object>> result = commonService.selectTimeStatValue(params);
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		for (Map<String, Object> m : result) {
			for (String k : m.keySet()) {
				if (m.get(k) instanceof Date) {
					m.put(k, sdf.format((Date) m.get(k)));
				}
			}
		}
		return R.ok().put("data", result);
	}
}
